// 322. 零钱兑换

// 给你一个整数数组 coins ，表示不同面额的硬币；以及一个整数 amount ，表示总金额。
// 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额，返回 -1 。
// 你可以认为每种硬币的数量是无限的。

var coinChange = function(coins, amount) {
    let dp = new Array(amount+1).fill(-1);
    dp[0] = 0;
    for(let coin of coins){
        for(let j = coin; j<= amount; j++){
            dp[j] = Math.min(dp[j], dp[j-coin] + 1);
        }
    }
    return dp[amount];
};


// 518. 零钱兑换 II

// 给你一个整数数组 coins 表示不同面额的硬币，另给一个整数 amount 表示总金额。
// 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额，返回 0 。
// 假设每一种面额的硬币有无限个。 

var change = function(amount, coins) {
    let dp = new Array(amount+1).fill(0);
    dp[0] = 1;
    for(let i = 0; i<coins.length; i++){
        for(let j = coins[i]; j<=amount; j++){
            dp[j] = dp[j]+dp[j-coins[i]];
        }
    }
    return dp[amount];
};